﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Aga.Psad.Backend.Entities;
using System.Web.Security;

namespace Aga.Psad.Backend.Repositories
{
    public class DocumentoRepository : RepositoryBase<Documento>
    {
        public Documento GetByClienteNumero(int clienteId, int tipoDocumentoId, string numeroDesde)
        {
            return DC.Documentos
                .Where(d =>
                    d.ClienteId.Equals(clienteId)
                    && d.TipoDocumentoId.Equals(tipoDocumentoId)
                    && d.NumeroDesde.Equals(numeroDesde))
                .SingleOrDefault();
        }

        public Documento GetByClienteNumeroAndCaja(int clienteId, int tipoDocumentoId, string numeroDesde, int caja)
        {
            return DC.Documentos
                .Where(d => 
                    d.ClienteId.Equals(clienteId)
                    && d.TipoDocumentoId.Equals(tipoDocumentoId)
                    && d.NumeroDesde.Equals(numeroDesde) 
                    && d.Caja.Equals(caja))
                .SingleOrDefault();
        }

        public List<Documento> Search(string username, string searchCriteria, int index, int pageSize)
        {
            List<Documento> documentosDelUsuario;
            //int searchCriteriaInt = 0;

            var usersService = new MvcMembership.AspNetMembershipProviderWrapper(Membership.Provider);
            var rolesService = new MvcMembership.AspNetRoleProviderWrapper(Roles.Provider);

            if (rolesService.IsInRole(usersService.Get(username), "Visualizador"))
            {
                documentosDelUsuario = GetAll();
            }
            else
            {
                documentosDelUsuario = GetByUser(username);
            }

            searchCriteria = searchCriteria.Trim().ToUpper();
            //int.TryParse(searchCriteria, out searchCriteriaInt);

            if (documentosDelUsuario.Count > 0 && !String.IsNullOrEmpty(searchCriteria))
            {
                // ToDo: Check the predicate!
                documentosDelUsuario = 
                    documentosDelUsuario.Where(
                    d =>
                        (d.NumeroDesde.ToUpper().Contains(searchCriteria))
                        || (d.NumeroHasta != null && d.NumeroHasta.ToUpper().Contains(searchCriteria))
                        || (d.Nombre != null && d.Nombre.ToUpper().Contains(searchCriteria))
                        || (d.Detalle != null && d.Detalle.ToUpper().Contains(searchCriteria))
                        || (d.TipoDocumento.Nombre != null && d.TipoDocumento.Nombre.ToUpper().Contains(searchCriteria))
                        || (d.Caja.ToString().ToUpper().Contains(searchCriteria))
                    ).ToList();

                // Aplico los filtros
                return documentosDelUsuario
                        .ToList();
            }

            return documentosDelUsuario;
        }

        private List<Documento> GetByUser(string username)
        {
            List<Documento> documentosDelUsuario = new List<Documento>();

            // Si el usuario es un declarante, obtengo sus despachos
            ClienteRepository clienteRepository = new ClienteRepository();
            List<Cliente> clientes = clienteRepository.GetByUserName(username);

            if (clientes.Count > 0)
            {
                foreach (var d in clientes)
                    documentosDelUsuario.AddRange(d.Documentos);
            }
            else
            {
                // Si el usuario es un importador, obtengo sus despachos
                ClienteDeClienteRepository clienteDeClienteRepository = new ClienteDeClienteRepository();
                List<ClienteDeCliente> clientesDeCliente = clienteDeClienteRepository.GetByUserName(username);

                if (clientesDeCliente.Count > 0)
                    foreach (var i in clientesDeCliente)
                        documentosDelUsuario.AddRange(i.Documentos);
            }


            return documentosDelUsuario;
        }
    }
}
